package com.xhj.mybatis.reflection.property;

import java.util.Locale;

/**
 * PropertyNamer
 *
 * @author XJks
 * @description 属性命名工具类，用于将 Java 的 getter/setter 方法名转换为属性名，并判断方法名类型。TODO:主要作用是从 getXxx/isXxx/setXxx 提取属性名，判断是否是有效访问器方法。
 */
public class PropertyNamer {

    /**
     * 私有构造方法，防止外部实例化该工具类。
     */
    private PropertyNamer() {
        // 防止实例化
    }

    /**
     * 将 getter/setter/is 方法名转换为属性名。
     * 例如：getName -> name, setAge -> age, isActive -> active
     *
     * @param name 方法名
     * @return 属性名
     */
    public static String methodToProperty(String name) {
        // 如果方法名以 "is" 开头（通常用于 boolean 类型的 getter）
        if (name.startsWith("is")) {
            // 去掉前缀 "is"
            name = name.substring(2);
            // 如果方法名以 "get" 或 "set" 开头
        } else if (name.startsWith("get") || name.startsWith("set")) {
            // 去掉前缀 "get" 或 "set"
            name = name.substring(3);
        } else {
            // 如果方法名不符合规范，抛出异常
            throw new RuntimeException("Error parsing property name '" + name + "'.  Didn't start with 'is', 'get' or 'set'.");
        }

        // 如果剩下的属性名长度为1，或第二个字符不是大写字母
        if (name.length() == 1 || (name.length() > 1 && !Character.isUpperCase(name.charAt(1)))) {
            // 将第一个字符转为小写，拼接后面的字符串
            name = name.substring(0, 1).toLowerCase(Locale.ENGLISH) + name.substring(1);
        }

        // 返回最终的属性名
        return name;
    }

    /**
     * 判断方法名是否为 getter 或 setter 方法。
     *
     * @param name 方法名
     * @return 如果是 getter 或 setter 返回 true，否则返回 false
     */
    public static boolean isProperty(String name) {
        return isGetter(name) || isSetter(name);
    }

    /**
     * 判断方法名是否为 getter 方法（以 "get" 或 "is" 开头，且长度大于前缀）。
     *
     * @param name 方法名
     * @return 如果是 getter 返回 true，否则返回 false
     */
    public static boolean isGetter(String name) {
        return (name.startsWith("get") && name.length() > 3) || (name.startsWith("is") && name.length() > 2);
    }

    /**
     * 判断方法名是否为 setter 方法（以 "set" 开头，且长度大于前缀）。
     *
     * @param name 方法名
     * @return 如果是 setter 返回 true，否则返回 false
     */
    public static boolean isSetter(String name) {
        return name.startsWith("set") && name.length() > 3;
    }

}